<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>
    // 基本语法
    // const p = new Promise((resolve, reject)=>{
    //     setTimeout(function(){
    //         if(Math.random() > 0.3){
    //             resolve("hello");
    //         }else{
    //             reject("error");
    //         }
    //     }, 0)
    // })

    // 实例方法
    // p.then((res)=>{
    //     console.log("成功了：", res)
    // }, (code)=>{
    //     console.log("失败了：", code)
    // })

    // p.catch((code)=>{
    //     console.log("catch处理的失败：", code)
    // })


    // 实例方法的返回值

    // - 如果返回的是一个新的promise实例，这个新的promise实例会被设置为then或catch自身的返回值
    // - 如果返回的不是一个promise实例，会将这个非promise实例包装成成功状态的promise实例，再设置为then或catch自身的返回值

    // 利用实例方法的返回值的特性，实现then或catch的链式调用

    // 优化回调地狱的问题：可读性差，方便调错，节省内存
    
    fn("接口A").then((res)=>{
        console.log("success", res);
        return fn("接口B");
        // return "hello";
    }).then((res)=>{
        console.log("success", res)
        return fn("接口C");
        // return "world"
    }).then((res)=>{
        console.log("success", res)
    }).catch((code)=>{
        console.log("error", code);
    })




    function fn(url){
        return new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve(url + "执行成功的数据");
            }, Math.random()*1000);

            setTimeout(function(){
                reject(url + "执行error的数据");
            }, Math.random()*1000);
        })
    }

    
</script>
</html>